package dongshi.daddy.consumer;

import dongshi.daddy.api.UserRpcService;
import dongshi.daddy.api.dto.UserDTO;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConsumerApplication {
    private static final Logger logger = LoggerFactory.getLogger("consumer_ConsumerApplication");
    public static void main(String[] args) {
        // 应用配置
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("user-service-consumer11191521");
        // 连接注册中心，获取服务提供者的信息
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("127.0.0.1:2181");
        //服务提供者协议配置
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(20880);
        protocol.setThreads(100);

        //引用远程服务
        //
        //注意：ReferenceConfig为重对象，内部封装了与注册中心的连接，以及与服务提供方的连接
        //     此实例很重，封装了与注册中心的连接以及与提供者的连接，请自行缓存，否则可能造成内存和连接泄漏
        ReferenceConfig<UserRpcService> reference = new ReferenceConfig<>();
        reference.setApplication(applicationConfig);
        reference.setRegistry(registryConfig);        //多个注册中心可以用setRegistries()
        reference.setInterface(UserRpcService.class);

        // 获取对象，像调用本地的一个对象一样调用，内部通过netty进行远程调用
        UserRpcService userRpcService = reference.get();
        UserDTO userDTO = userRpcService.get(1000000);
        logger.info("[通过API配置方式，获得用户为({})", userDTO);

    }
}
